package model.histoire;

import java.util.LinkedHashMap;

import t2s.SIVOXDevint;
import tool.externalResLoader.absExternalRessource;
import tool.externalResLoader.absTreeFileLoader;
import controleur.Config;
import controleur.GameControleur;
import controleur.eMenuOption;
import exception.FileFormatException;
import exception.PathErrorException;

/**
 * Classe abstraite repr�sentant une transition g�n�rique
 */
public abstract class absTransition extends absExternalRessource
{
	public static SIVOXDevint voix = new SIVOXDevint();

	// Descritpion de la transition
	public final String desc;
	// L'id de la transition (unique)
	public final Integer id;
	// Transitions suivantes, format : <idSuivant, descriptionChoix>
	public final LinkedHashMap<Integer, String> suivantes;
	// Titre de la transition
	public final String titre;

	public absTransition(absTreeFileLoader r) throws FileFormatException
	{
		super(r);

		try
		{
			this.id = r.getElementInt("id");
			this.titre = r.getElementString("titre");
			this.desc = r.getElementString("descritpion").replaceAll("\t", " ")
					.replaceAll("\n", "").replaceAll("  ", " ");

			this.suivantes = new LinkedHashMap<Integer, String>();
			for (absTreeFileLoader s : r.getElements("suivants"))
				this.suivantes.put(s.getElementInt("id"), s
						.getElementString("texte"));
		}
		catch (PathErrorException e)
		{
			throw new FileFormatException(e, r);
		}
	}

	public absTransition(Integer id, String titre, String desc,
			LinkedHashMap<Integer, String> suivantes)
	{
		super(null);
		this.id = id;
		this.titre = titre;
		this.desc = desc;
		this.suivantes = suivantes;
	}

	/**
	 * Ajoute une transition a la liste des suivantes
	 * 
	 * @param s la transition a ajouter
	 */
	public void addSuivant(absTransition s, String text)
	{
		this.suivantes.put(s.id, text);
	}

	/**
	 * Execute l'evenement, et retourne l'evenement suivant
	 * 
	 * @return
	 */
	public abstract void execute(GameControleur c, Config cfg);

	public Integer getNext(eMenuOption e)
	{
		Integer[] k = this.suivantes.keySet().toArray(
				new Integer[this.suivantes.size()]);
		int retour = e.toInt();
		if (retour == -1)
			return retour;
		else
			return k[retour - 1];
	}

	/**
	 * Enleve une transition de la liste
	 * 
	 * @param t le parametre a enlever
	 * @return true si l'element a ete supprime
	 */
	public boolean removeSuivant(absTransition t)
	{
		if (!this.suivantes.keySet().contains(t))
			return false;

		this.suivantes.remove(t);
		return true;
	}

	@Override
	public absTreeFileLoader save(absTreeFileLoader r)
	{
		r.setName(this.getClass().getSimpleName());
		try
		{
			r.addElement("id", this.id.toString());
			r.addElement("titre", this.titre);
			r.addElement("descritpion", this.desc);

			if (this.suivantes == null || this.suivantes.isEmpty())
				r.addElement("suivants", "");
			else
				for (Integer key : this.suivantes.keySet())
				{
					absTreeFileLoader i = (r.getClass().getConstructor())
							.newInstance();
					i.setName("suivant");
					i.addElement("id", key.toString());
					i.addElement("texte", this.suivantes.get(key));
					r.addElement("suivants", i);
				}
		}
		catch (Exception e)
		{
			e.printStackTrace();
			return null;
		}
		return r;
	}

	@Override
	public String toString()
	{
		return String.format("[%s ID:%d] Desc:%s, Titre:%s, Suivantes:%s", this
				.getClass().getName(), this.id, this.desc, this.titre,
				this.suivantes.toString());
	}

}
